/*************************************************
   Цифровой вольтметр, использующий
   АЦП Maxim MAX1241, подключенный
   к AT90S8515 по шине SPI
   Измеренное напряжение передается
   через интерфейс RS232 STK500
   Параметры связи: 9600 8N1
   
   CodeVisionAVR C Compiler
   (C) 2000-2002 HP InfoTech S.R.L.
   www.hpinfotech.ro
   
   Тип чипа: AT90S8515
   Тактовая частота: 3.686400 МГц
   Модель Памяти: Small
   Размер Внутреннего RAM: 512
   Размер Внешнего RAM: 0
   Размер Стека Данных: 128
*************************************************
   MAX1241 подключен к STK500:
   [MAX1241] [Разъем PORTB]
    1 VDD   - 10 +5V
    2 Vin
    3 /SHDN - 1 PB0
    4 REF   - 10 +5V
    5 GND   - 9 GND
    6 DOUT  - 7 MISO
    7 /CS   - 2 PB1
    8 SCLK  - 8 SCK
   Для того чтобы использовать разъем RS232 SPARE
   на STK500, должны быть сделаны следующие соединения:
   [разъем RS232 SPARE] [разъем PORTD]
          RXD          -    1 PD0
          TXD          -    2 PD1
   ПРИМЕЧАНИЕ: ПОСЛЕ ПРОГРАММИРОВАНИЯ ЧИПА, ОТСОЕДИНИТЕ
   6-ЖИЛЬНЫЙ ПРОГРАММИРУЮЩИЙ КАБЕЛЬ ОТ РАЗЪЕМА SPROG3
*/

#include <90s8515.h>
// Стандартные функции ввода/вывода
#include <stdio.h>
// функции SPI
#include <spi.h>
// функции задержки
#include <delay.h>

// Опорное напряжение MAX1241 [мВ]
#define VREF 5000
// определения управляющих сигналов MAX1241
#define NSHDN PORTB.0
#define NCS PORTB.1
#define DOUT PINB.6

union adcu
{
   unsigned char byte[2];
   unsigned int word;
};

// Сделаем одно АЦ преобразование и вернем значение
unsigned int max1241_read(void)
{
   union adcu adc_data;
   // вывод MAX1241 из режима останова
   NSHDN=1;
   // ждем 5 мкс, чтобы MAX1241 проснулся
   delay_us(5);
   // теперь выберем чип, чтобы начать преобразование
   NCS=0;
   // ждем завершения преобразования
   // в течение преобразования DOUT будет 0
   while (DOUT==0);
   // DOUT=1 -> преобразование завершено
   // читаем MSB (старший байт)
   adc_data.byte[1]=spi(0);
   // читаем LSB (младший байт)
   adc_data.byte[0]=spi(0);
   // отменим выбор чипа
   NCS=1;
   // введем режим выключения
   NSHDN=0;
   // теперь отформатируем результат и вернем его
   return (adc_data.word>>3)&0xfff;
}

void main(void)
{
   // здесь будет храниться результат преобразования
   unsigned n;
   // Инициализация портов ввода/вывода
   // Порт A
   DDRA=0x00;
   PORTA=0x00;
   // Порт B
   // Вывод /SS установим как выход
   // с уровнем 1, это требует
   // SPI для работы в режиме master
   DDRB=0xA3;
   PORTB=0x12;
   // Порт C
   DDRC=0x00;
   PORTC=0x00;
   // Порт D
   DDRD=0x00;
   PORTD=0x00;
   // Инициализация UART
   // Параметры Связи: 8 Данных, 1 Стоп, Нет Четности
   // UART Приемник: Выкл
   // UART Передатчик: Вкл
   UCR=0x08;
   // Скорость передачи UART: 9600 @ 3.6864 МГц
   UBRR=23;
   // Инициализация SPI
   // Тип SPI: Master
   // Тактовая частота SPI: 921.6 kHz
   // Фаза Тактирования SPI: Половина Цикла
   // Полярность Тактирования SPI: Низкий уровень
   // Порядок Данных SPI: MSB (старший байт) Первый
   SPCR=0x50;
   putsf("MAX1241 Demo using the CodeVisionAVR C Compiler");
   putsf("***********************************************\n");
   // Сделаем АЦ преобразования и пошлем результаты на RS232
   while (1)
   {
      n=max1241_read();
printf("MAX1241-> N=%4u U=%4umV\r\n",n,(unsigned)((long)n*VREF/4096));
      // 0.3 sec. delay
      delay_ms(300);
   };
}
